home *** CD-ROM | disk | FTP | other *** search
Java Source | 1996-11-25 | 9.4 KB | 245 lines |
- // DirBrowser.java
- // simple 3D directory browser
- import vrml.*;
- import vrml.node.*;
- import vrml.field.*;
-
- import java.io.*;
-
- public class DirBrowser extends Script {
- private Browser b; // to display error message
- private File dir;
- private SFString dirname;
- private MFNode addChildren = null; // to add sub directory/files
- private SFInt32 whichChoice = null; // to show/hide sub direcotry
-
- public final static int NOTOPENED = 0;
- public final static int OPENED = 1;
- public final static int HIDE = 2;
- private int opened = NOTOPENED;
- static int r = 0;
- public final static float FILESIZE = 1000.0f; // 1K byte
-
- final String HEADER = "#VRML V2.0 utf8\n";
- final String ROOT1R = "Transform { \n" +
- " children [ \n" +
- " Transform { translation 0 0 5 \n" +
- " children [ \n" +
- " Shape { \n " +
- " appearance DEF MAT Appearance{ \n" +
- " material Material{ \n" +
- " diffuseColor 0 0 1 \n" +
- " emissiveColor 0 0 1 \n" +
- " transparency 0.5 \n" +
- " } \n" +
- " } \n" +
- " geometry Box { size 0.2 0.2 10.0 }}] \n" +
- " } \n" +
- " Transform { \n" +
- " rotation 1 0 0 1.57 \n" +
- " children [ \n " +
- " Shape { \n " +
- " appearance USE MAT \n" +
- " geometry Cylinder { radius ";
- final String ROOT2E = " height 0.01 } }\n" +
- " ] \n" +
- " }\n";
-
- final String TAILER1R = " ]\n";
- final String TAILER2E = "}\n";
-
- final String ROUTING1T = "ROUTE ";
- final String ROUTING2S = ".isActive TO ";
- final String ROUTING3E = ".clicked \n";
-
- final String DIROBJ1XY = "Transform { \n translation ";
- final String DIROBJ2U = " 0 \n" +
- " children [ \n" +
- " Transform { \n" +
- " children [ \n" +
- " Anchor { \n" +
- " url \"";
- final String DIROBJ3T = "\" \n" +
- " children [ \n" +
- " DEF ";
- final String DIROBJ4S = " TouchSensor {} \n" +
- " Shape { geometry Sphere {}} \n" +
- " ] \n" +
- " } \n" +
- " ] \n" +
- " } \n" +
- " DEF SW Switch {\n" +
- " whichChoice 0 \n" +
- " choice [\n" +
- " DEF DIR Transform { translation 0 0 -10 } \n" +
- " ] \n" +
- " } \n" +
- " ] \n" +
- "} \n" +
- "DEF ";
- final String DIROBJ5F = " Script { \n" +
- " url \"DirBrowser.class\" \n" +
- " eventIn SFBool clicked \n" +
- " field SFNode dirnode USE DIR \n" +
- " field SFNode swnode USE SW \n" +
- " field SFString dirname \"";
- final String DIROBJ6E = "\" \n" +
- "} \n";
-
- final String FILEOBJ1XYZ = "Transform { \n" +
- " translation ";
- final String FILEOBJ2U = " children [ \n" +
- " Anchor { \n" +
- " url \"";
- final String FILEOBJ3H = "\"" +
- " children [ \n" +
- " Shape { \n" +
- " appearance Appearance { \n" +
- " material Material { \n" +
- " diffuseColor 1 1 0 \n" +
- " } \n" +
- " } \n" +
- " geometry Box { size 2.0 2.0 ";
- final String FILEOBJ4E = "}\n" +
- " } \n" +
- " ] \n" +
- " } \n" +
- " ] \n" +
- "}\n";
-
- public void initialize() {
- Node tmpnode;
-
- b = getBrowser();
-
- dirname = (SFString) getField("dirname");
-
- // to add sub directory/files
- tmpnode = (Node)((SFNode)getField("dirnode")).getValue();
- addChildren = (MFNode)tmpnode.getEventIn("addChildren");
-
- // to show/hide sub direcotry
- tmpnode = (Node)((SFNode)getField("swnode")).getValue();
- whichChoice = (SFInt32)tmpnode.getExposedField("whichChoice");
- }
-
- public void processEvent(Event ev){
- if(ev.getName().equals("clicked")){
- ConstSFBool v = (ConstSFBool)ev.getValue();
-
- if(false == v.getValue()){
- if(NOTOPENED == opened){
- openDirectory(dirname.getValue());
- opened = OPENED;
- } else if(OPENED == opened){
- whichChoice.setValue(-1);
- opened = HIDE;
- } else if (HIDE == opened) {
- whichChoice.setValue(0);
- opened = OPENED;
- }
- }
- }
- }
-
- public void openDirectory(String directory){
- String[] files;
- int numfiles;
- float angle;
- float radius;
-
- try {
- dir = new File(directory);
- }catch (Exception e){
- b.setDescription("Can not open " + directory);
- e.printStackTrace();
- return;
- }
-
- if(false == dir.isDirectory()){
- b.setDescription("No such a directory: " + directory);
- return;
- }
-
- files = dir.list();
- numfiles = files.length;
-
- if(0 == numfiles) return;
-
- if(2 < numfiles) {
- angle = (float)(Math.PI * 2/numfiles);
- radius = (float)(6.0/(2.0 * Math.sin(angle)));
- } else if(2 == numfiles) {
- angle = (float) Math.PI;
- radius = 2.0f;
- } else {
- // if there is one file or directory ...
- angle = 0.0f;
- radius = 0.1f;
- }
-
- String vrmldir = HEADER + ROOT1R + radius + ROOT2E;
- String routing = "";
-
- for(int i = 0; i < numfiles; i++){
- File f = null;
- String filename = null;
- float x, y;
-
- if(0.0f != angle){
- x = (float)(radius * Math.sin(angle * i));
- y = (float)(radius * Math.cos(angle * i));
- } else {
- x = y = 0.0f;
- }
-
- try {
- filename = directory + "/" + files[i];
- f = new File(filename);
-
- if(f.isDirectory()){
- String touchsenor = "TS" + r;
- String script = "SC" + r; r++;
-
- vrmldir = vrmldir + DIROBJ1XY + x + " " + y +
- DIROBJ2U + filename +
- DIROBJ3T + touchsenor +
- DIROBJ4S + script +
- DIROBJ5F + filename +
- DIROBJ6E;
-
- routing += ROUTING1T + touchsenor +
- ROUTING2S + script +
- ROUTING3E;
- } else {
- float height = (float)(f.length()/FILESIZE);
-
- if(height < 0.000001f) height = 0.1f;
-
- vrmldir += FILEOBJ1XYZ + x + " " + y + " " + (-(height/2.0)) + "\n" +
- FILEOBJ2U + filename +
- FILEOBJ3H + (height) +
- FILEOBJ4E;
- }
- } catch (Exception e) {
- b.setDescription("Can not open " + filename);
- e.printStackTrace();
- return;
- }
- }
- vrmldir = vrmldir + TAILER1R + routing + TAILER2E;
- // System.out.println(vrmldir);
-
- // create VRML objects and add them to the scene
- try {
- BaseNode nodes[] = b.createVrmlFromString(vrmldir);
- if(null != nodes) {
- addChildren.setValue(nodes);
- }
- } catch (Exception e) {
- b.setDescription("can not create VRML node");
- e.printStackTrace() ;
- }
- }
- }
-